#ifndef HTTP_REQUEST_H
#define HTTP_REQUEST_H

#include <unordered_map>
#include <unordered_set>
#include <string>
#include <regex> //正则表达式
#include "Buffer.h"
class HTTPrequest
{
public:
    enum PARSE_STATE
    {
        REQUEST_LINE, // 解析请求头
        HEADERS,      // 解析请求行
        BODY,         // 解析请求体
        FINISH,       // 解析完成
    };
    enum HTTP_CODE
    {
        NO_REQUEST = 0,     // 没有请求
        GET_REQUEST,        // get请求
        BAD_REQUEST,        // 错误的请求
        NO_RESOURCE,        // 没有该资源
        FORBIDDENT_REQUEST, // 被服务器禁止请求
        FILE_REQUEST,       // 请求文件
        INTERNAL_ERROR,     // 服务器内部错误
        CLOSED_CONNECTION,  // 客户端与服务器之间的连接已经关闭
    };
    HTTPrequest() { init(); };
    ~HTTPrequest() = default;
    void init();
    bool parse(Buffer &buff); // 解析HTTP请求
    // 获取HTTP信息
    std::string path() const;
    std::string &path();
    std::string method() const;
    std::string version() const;
    std::string getPost(const std::string &key) const;
    std::string getPost(const char *key) const;

    bool isKeepAlive() const;

private:
    bool _parseRequestLine(const std::string &line);   // 解析请求行
    void _parseRequestHeader(const std::string &line); // 解析请求头
    void _parseDataBody(const std::string &line);      // 解析数据体

    void _parsePath();
    void _parsePost();

    static int converHex(char ch);

    PARSE_STATE _state;
    std::string _method, _path, _version, _body; // 请求方法get或者post、请求路径、HTTP 协议的版本、HTTP 请求体的内容。
    std::unordered_map<std::string, std::string> _header;
    std::unordered_map<std::string, std::string> _post;

    static const std::unordered_set<std::string> DEFAULT_HTML;
};
#endif